package com.example.paopao.passport.mybatis;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Slf4j
@Component
public class TimeMetaObjectHandler implements MetaObjectHandler {
    /*MetaObjectHandler:是Mybatis框架的一个接口，用于处理实体对象在插入和更新时的元对象操作
    * 在使用Mybatis进行数据库操作时，我们通常需要在插入和更新数据前后对实体对象进行一些自定义处理
    * 使用MetaObjectHandler,需要在实体类中声明相应的字段，并使用mybatis提供的注解
    * @TableField标记这些字段，在使用MetaObjectHandler的类中，可以重写insertFill和updateFill
    * */

    /*数据创建时间的属性名*/
    public static final String FIELD_CREATE_TIME="Create";

    public static final String FIELD_UPDATE_TIME="Modified";

    @Override
    public void insertFill(MetaObject metaObject) {
        /*LocalDateTime 是java8中引入的一个类，用于表示日期和时间对象，但不包含时区信息
        * 它可以存储年月日时分秒和纳秒等时间信息
        * 使用LocalDateTime可以方便进日期和时间的处理，如创建特定日期时间，比较日期时间，格式化日期时间等操作
        * 创建当前日期时间：LocalDateTime.now();
        * 创建指定日期时间：LocalDateTime.of(year,month,dayOfMonth,hour,minute,second)
        * 格式化为字符串：localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
        * 从字符串解析为：LocalDateTime对象：LocalDateTime.parse("2023-10-20 15:30:00",DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
        * 比较两个日期时间：localDateTime1.compareTo(localDateTime2)
        * 增加或减少时间：locaDateTIme.plusDays(1),localDateTime.minusHours(2);
        * 获取日期时间的各个部分：localDateTime.plusDays(1),localDateTime.getMonth(),localDateTime.getDayOfMonth();
        * */
        LocalDateTime now= LocalDateTime.now();
        this.setFieldValByName(FIELD_CREATE_TIME,now,metaObject);
        this.setFieldValByName(FIELD_UPDATE_TIME,now,metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        LocalDateTime now=LocalDateTime.now();
        this.setFieldValByName(FIELD_UPDATE_TIME,now,metaObject);
    }
}
